#include "bsp_button.h"
#include "driver/gpio.h"
#include "multi_button.h"
#include "freertos/FreeRTOS.h"

#define BUTTON1_PIN 0 // 中间
#define BUTTON2_PIN 39 // 下
#define BUTTON3_PIN 40 // 上

#define BUTTON1_ID 0
#define BUTTON2_ID 1
#define BUTTON3_ID 2

static struct Button button1;
static struct Button button2;
static struct Button button3;


static void button1_callback_single_click(void* btn);
static void button2_callback_single_click(void* btn);
static void button3_callback_single_click(void* btn);
static void button1_callback_long_press(void* btn);

static TimerHandle_t sw_timer_5ms = NULL;  // 定时器句柄

// 定时器回调函数（5ms触发一次）
static void timer_5ms_callback(TimerHandle_t xTimer) {
    // 在此处编写需要周期性执行的代码
    // uint32_t count = (uint32_t)pvTimerGetTimerID(xTimer);  // 获取用户参数（可选）
    // count++;
    // vTimerSetTimerID(xTimer, (void*)count);  // 更新参数（可选）
	button_ticks();  // 更新按钮状态

}

void button_gpio_config(void)
{
    // GPIO配置
    gpio_reset_pin(BUTTON1_PIN);
    gpio_set_direction(BUTTON1_PIN, GPIO_MODE_INPUT);
    gpio_set_pull_mode(BUTTON1_PIN, GPIO_PULLUP_ONLY);

    gpio_reset_pin(BUTTON2_PIN);
    gpio_set_direction(BUTTON2_PIN, GPIO_MODE_INPUT);
    gpio_set_pull_mode(BUTTON2_PIN, GPIO_PULLUP_ONLY);

    gpio_reset_pin(BUTTON3_PIN);
    gpio_set_direction(BUTTON3_PIN, GPIO_MODE_INPUT);
    gpio_set_pull_mode(BUTTON3_PIN, GPIO_PULLUP_ONLY);
}

uint8_t button_get_level(uint8_t button_id)
{
    uint8_t level = 1;
    switch (button_id) {
        case BUTTON1_ID:
            level = gpio_get_level(BUTTON1_PIN);
            break;
        case BUTTON2_ID:
            level = gpio_get_level(BUTTON2_PIN);
            break;
        case BUTTON3_ID:
            level = gpio_get_level(BUTTON3_PIN);
            break;
        default:
            break;
    }
    return level;
}

void button_create_timer(void)
{
	// 创建软件定时器
    sw_timer_5ms = xTimerCreate(
        "5msTimer",                // 定时器名称（调试用）
        pdMS_TO_TICKS(5),          // 周期（5ms，转换为FreeRTOS tick数）
        pdTRUE,                    // 自动重载（周期性定时器）
        (void*)0,                  // 用户参数（初始计数）
        timer_5ms_callback         // 回调函数
    );
    // 检查定时器是否创建成功
    if (sw_timer_5ms == NULL) {
        printf("Failed to create timer!\n");
        return;
    }

    // 启动定时器（从调度器启动）
    if (xTimerStart(sw_timer_5ms, 0) != pdPASS) {
        printf("Failed to start timer!\n");
    }
}

// 按键初始化
void bsp_button_init(void)
{
    // 初始化按键GPIO
    button_gpio_config();
    // 初始化按键框架
    button_init(&button1, button_get_level, 0, BUTTON1_ID);
    button_init(&button2, button_get_level, 0, BUTTON2_ID);
    button_init(&button3, button_get_level, 0, BUTTON3_ID);
    // 注册按键事件回调
    button_attach(&button1, SINGLE_CLICK, button1_callback_single_click);
    button_attach(&button1, LONG_PRESS_START, button1_callback_long_press);
    button_attach(&button2, SINGLE_CLICK, button2_callback_single_click);
    button_attach(&button3, SINGLE_CLICK, button3_callback_single_click);
    // 启动按键
    button_start(&button1);
    button_start(&button2);
    button_start(&button3);
    // 创建并启动定时器
    button_create_timer();
}
extern uint8_t button1_sc_flag;
extern uint8_t button2_sc_flag;
extern uint8_t button3_sc_flag;
extern uint8_t button1_lp_flag;
static void button1_callback_single_click(void* btn)
{
    printf("Button 1 Single Click\n");
    button1_sc_flag = 1; // 设置标志位
    printf("button1_sc_flag = %d\n", button1_sc_flag);
}

static void button2_callback_single_click(void* btn)
{
    printf("Button 2 Single Click\n");
    button2_sc_flag = 1; // 设置标志位
}

static void button3_callback_single_click(void* btn)
{
    printf("Button 3 Single Click\n");
    button3_sc_flag = 1; // 设置标志位
}

static void button1_callback_long_press(void* btn)
{
    printf("Button 1 Long Press\n");
    button1_lp_flag = 1;
}








